package com.zy.ems.common.base;

import java.io.Serializable;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.transaction.annotation.Transactional;

/**
 * 服务公共抽象类。
 * 
 * @author Luffy
 *
 * @param <E>
 * @param <PK>
 */
@Transactional
public abstract class BaseService<E extends BaseEntity, PK extends Serializable> {

    protected Logger log = LoggerFactory.getLogger(getClass());

    public abstract BaseDao<E, PK> getEntityDao();

    /**
     * 根据主键查询数据。
     * 
     * @param id
     * @return
     * @throws DataAccessException
     */
    @Transactional(readOnly = true)
    public E getById(PK id) throws DataAccessException {
        return getEntityDao().getById(id);
    }

    /**
     * 查询所有数据。
     * 
     * @return
     * @throws DataAccessException
     */
    @Transactional(readOnly = true)
    public List<E> findAll() throws DataAccessException {
        return getEntityDao().findAll();
    }

    /**
     * 插入数据。
     * 
     * @param entity
     * @throws DataAccessException
     */
    public void save(E entity) throws DataAccessException {
        getEntityDao().save(entity);
    }

    /**
     * 根据主键删除数据。
     * 
     * @param id
     * @throws DataAccessException
     */
    public void deleteById(PK id) throws DataAccessException {
        getEntityDao().deleteById(id);
    }

    /**
     * 更新数据。
     * 
     * @param entity
     * @throws DataAccessException
     */
    public void update(E entity) throws DataAccessException {
        getEntityDao().update(entity);
    }

    /**
     * 唯一性检查。
     * 
     * @param entity
     * @param uniquePropertyNames
     * @return
     * @throws DataAccessException
     */
    @Transactional(readOnly = true)
    public boolean isUnique(E entity, String uniquePropertyNames)
            throws DataAccessException {
        return getEntityDao().isUnique(entity, uniquePropertyNames);
    }

}
